[设计模式]之五:职责链模式


定义

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

场景

需要层层审批的,直到某一层可以给出具体结果。
比如离职申请,首先发给团队主管,然后团队主管发给部门经理,之后再给总经理这样,一层一层上传,直到信息传给能够给出反馈的人。

UML

示例代码

//统一处理接口
abstract class Handler {
    protected Handler handler;

    public void setHandler(Handler handler) {
        this.handler =  handler;
    }

    public abstract void HandlerRequest(int req);
}
//具体实现 处理不同的内容
public class ConcreteHandler1 extends Handler {

    @Override
    public void HandlerRequest(int req) {
        // TODO Auto-generated method stub
        if (req >= 0 && req < 10) {
            System.out.println("Handler1 handle " + req + " now");
        } else if (handler != null) {
            handler.HandlerRequest(req);
        }
    }

}
public class ConcreteHandler2 extends Handler {

    @Override
    public void HandlerRequest(int req) {
        // TODO Auto-generated method stub
        if (req >= 10 && req < 20) {
            System.out.println("Handler2 handle " + req + " now");
        } else if (handler != null) {
            handler.HandlerRequest(req);
        }
    }

}
public class ConcreteHandler3 extends Handler {

    @Override
    public void HandlerRequest(int req) {
        // TODO Auto-generated method stub
        if (req >= 20 && req < 30) {
            System.out.println("Handler3 handle " + req + " now");
        } else if (handler != null) {
            handler.HandlerRequest(req);
        }
    }

}
//客户代码
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Handler h1 = new ConcreteHandler1();
        Handler h2 = new ConcreteHandler2();
        Handler h3 = new ConcreteHandler3();

        h1.setHandler(h2);
        h2.setHandler(h3);

        List list = new ArrayList();
        list.add(2);
        list.add(5);
        list.add(14);
        list.add(22);
        list.add(18);
        list.add(3);
        list.add(27);
        list.add(20);

        for(Integer i : list) {
            h1.HandlerRequest(i);
        }
    }
//输出
Handler1 handle 2 now
Handler1 handle 5 now
Handler2 handle 14 now
Handler3 handle 22 now
Handler2 handle 18 now
Handler1 handle 3 now
Handler3 handle 27 now
Handler3 handle 20 now

评价

一个很好的优点是,当客户提交一个请求时,请求是按着链传递,直至有一个ConcreteHandler对象负责处理。也就是请求一定会被处理。

另外降低了耦合度。因为这个结构,接收者和发送者都不清楚对方的明确信息,且链中对象也不知道链的结构。结果是职责链可简化对象的相互连接,它们仅需要保持一个指向其后继者的引用,而不需保持它所有的候选接收者的引用。

最后,可以随时增加或修改处理一个请求的结构,增强了给对象指派职责的灵活性。


文章作者: Wossoneri
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC 4.0 许可协议。转载请注明来源 Wossoneri !
评论
  目录